﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using grupo2DEWStudio7i.Dominio;
using grupo2DEWStudio7i.Persistencia;
using System.Data.SqlClient;

namespace grupo2DEWStudio7i.Persistencia.ADO
{
    public class ClienteDAO : IClienteDAO
    {
        public Cliente Crear(Cliente clienteACrear)
        {
            string _Sentencia = "INSERT INTO Cliente VALUES(@codigo, @nombre, @dni, @clave, @correo, @fecnac)";
            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@nombre", clienteACrear.Nombre));
                    _Comando.Parameters.Add(new SqlParameter("@dni", clienteACrear.Dni));
                    _Comando.Parameters.Add(new SqlParameter("@fecnac", clienteACrear.FecNac));
                    _Comando.Parameters.Add(new SqlParameter("@clave", clienteACrear.Clave));
                    _Comando.Parameters.Add(new SqlParameter("@correo", clienteACrear.Correo));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }

        public Cliente Obtener(int codigo)
        {
            string _Sentencia = "SELECT codigo,nombre, dni, clave, correo, fecnac FROM Cliente WHERE codigo=@codigo";
            Cliente clienteCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            clienteCreado = new Cliente();
                            clienteCreado.Codigo = _Resultado.GetInt32(0);
                            clienteCreado.Nombre = _Resultado.GetString(1);
                            clienteCreado.Dni = _Resultado.GetString(2);
                            clienteCreado.Clave = _Resultado.GetString(3);
                            clienteCreado.Correo = _Resultado.GetString(4);
                            clienteCreado.FecNac = _Resultado.GetString(5);
                        }
                    }
                }
            }
            return clienteCreado;
        }
        public Cliente Modificar(Cliente clienteAModificar)
        {
            string _Sentencia = @"UPDATE cliente SET nombre=@nombre,dni=@dni,fecnac=@fecnac,clave=@clave,correo=@correo WHERE codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", clienteAModificar.Nombre));
                    _Comando.Parameters.Add(new SqlParameter("@dni", clienteAModificar.Dni));
                    _Comando.Parameters.Add(new SqlParameter("@fecnac", clienteAModificar.FecNac));
                    _Comando.Parameters.Add(new SqlParameter("@clave", clienteAModificar.Clave));
                    _Comando.Parameters.Add(new SqlParameter("@correo", clienteAModificar.Correo));
                    _Comando.Parameters.Add(new SqlParameter("@codigo", clienteAModificar.Codigo));

                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(clienteAModificar.Codigo);
        }
        public void Eliminar(Cliente clienteAEliminar)
        {
            string _Sentencia = "DELETE FROM cliente WHERE codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", clienteAEliminar.Codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Cliente> ListarTodos()
        {
            string _Sentencia = "SELECT codigo, nombre, dni, clave,correo,fecnac FROM Cliente";
            ICollection<Cliente> clientesEncontrados = new List<Cliente>();
            Cliente clienteEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            clienteEncontrado = new Cliente();
                            clienteEncontrado.Codigo = _Resultado.GetInt32(0);
                            clienteEncontrado.Nombre = _Resultado.GetString(1);
                            clienteEncontrado.Dni = _Resultado.GetString(2);
                            clienteEncontrado.FecNac = _Resultado.GetString(5);
                            clienteEncontrado.Clave = _Resultado.GetString(3);
                            clienteEncontrado.Correo = _Resultado.GetString(4);
                            clientesEncontrados.Add(clienteEncontrado);
                        }
                    }
                }
            }
            return clientesEncontrados;
        }

        public ICollection<Cliente> ListarBusqueda(int? codigo, string nombre, string dni, string fecnac, string clave, string correo)
        {
            string _Sentencia = @"SELECT codigo, nombre, dni, clave,correo,fecnac 
                FROM Cliente WHERE 1=1";
            ICollection<Cliente> clientesEncontradas = new List<Cliente>();
            Cliente clienteEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (codigo != null)
                    {
                        _Sentencia = _Sentencia + " AND codigo=@codigo";
                        _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    }
                    if (nombre != null)
                    {
                        _Sentencia = _Sentencia + " AND nombre LIKE '%'+@nombre+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    }
                    if (dni != null)
                    {
                        _Sentencia = _Sentencia + " AND dni LIKE '%'+@dni+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@dni", dni));
                    }
                    if (fecnac != null)
                    {
                        _Sentencia = _Sentencia + " AND fecnac=@fecnac";
                        _Comando.Parameters.Add(new SqlParameter("@fecnac", fecnac));
                    }
                    if (clave != null)
                    {
                        _Sentencia = _Sentencia + " AND clave=@clave";
                        _Comando.Parameters.Add(new SqlParameter("@clave", clave));
                    }
                    if (correo != null)
                    {
                        _Sentencia = _Sentencia + " AND correo=@correo";
                        _Comando.Parameters.Add(new SqlParameter("@correo", correo));
                    }

                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            clienteEncontrado = new Cliente();
                            clienteEncontrado.Codigo = (int)_Resultado["codigo"];
                            clienteEncontrado.Nombre = (string)_Resultado["nombre"];
                            clienteEncontrado.Dni = (string)_Resultado["dni"];
                            clienteEncontrado.FecNac = (string)_Resultado["fecnac"];
                            clienteEncontrado.Clave = ((string)_Resultado["clave"]);
                            clienteEncontrado.Correo = (string)_Resultado["correo"];
                            clientesEncontradas.Add(clienteEncontrado);
                        }
                    }
                }
            }
            return clientesEncontradas;
        }


        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(codigo) FROM Cliente";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}